package com.example.crm.service.impl;

import com.example.crm.mapper.CustomerMapper;
import com.example.crm.pojo.Customer;
import com.example.crm.service.ICustomerService;
import lombok.Getter;
import lombok.Setter;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.inject.Inject;
import javax.inject.Named;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;


// @Component   声明Bean

// @Controller              -> 控制器的bean
// @Service                 -> 业务逻辑层的bean
// @Repository  @Mapper     -> 配置DAO的bean


@Component(value="customerService")
@Setter
@Getter
public class CustomerServiceImpl implements ICustomerService
{

    // 简单类型的注入
    @Value("Rose")
    private String name = "Jack";

    // 引用类型的注入
    //第一种： 使用@Value 结合SpEL  ---- spring3.0 后用
    //其中customerDao表示<bean>节点id的属性值
    /**第一种： 使用@Value 结合SpEL  ---- spring3.0 后用*/
//    //@Value(value="#{customerDao}")
//    @Value(value="#{customerMapper}")
//    CustomerMapper customerMapper;

//    第二种：使用@Autowired 结合 @Qualifier
//    单独使用@Autowired ，表示按照类型注入，会到spring容器中查找CustomerDao的类型，对应<bean class=””>，class的属性值，如果找到，可以匹配。    @Autowired
    @Autowired
    CustomerMapper customerMapper;

//    第三种： JSR-250标准（基于jdk） 提供注解@Resource
//    单独使用@Resource注解，表示先按照名称注入，会到spring容器中查找customerDao的名称，对应<bean id=””>，id的属性值，如果找到，可以匹配。
//    如果没有找到，则会按照类型注入，会到spring容器中查找CustomerDao的类型，对应<bean class=””>，class的属性值，如果找到，可以匹配，如果没有找到会抛出异常。
    // ???
//    @Resource(name="customerDao")
//    CustomerMapper customerMapper;

    //第四种： JSR-330标准（jdk） 提供 @Inject ，配合@Named注解
//    @Inject//默认按照类型注入
//    @Named("customerMapper")//按照名字注入，必须配合@Inject使用
//    CustomerMapper customerMapper;

    @Override
    public boolean add(Customer c)
    {
//        SqlSession sqlSession = this.sqlSessionFactory.openSession();
//        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        int result = customerMapper.insert(c);
//        sqlSession.commit();
        return result==1;
    }

    @Override
    public boolean removeById(long id) {
//        SqlSession sqlSession = this.sqlSessionFactory.openSession();
//        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        int result = customerMapper.deleteByPrimaryKey(id);
//        sqlSession.commit();
        return result==1;
    }

    @Override
    public List<Customer> findAll() {
//        SqlSession sqlSession = this.sqlSessionFactory.openSession();
//        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        List<Customer> list = customerMapper.selectByExample(null);
        return list;
    }

    @Override
    public Customer findById(long id)
    {
//        SqlSession sqlSession = this.sqlSessionFactory.openSession();
//        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        Customer c = customerMapper.selectByPrimaryKey(id);
        return c;
    }

    @Override
    public boolean update(Customer c) {
//        SqlSession sqlSession = this.sqlSessionFactory.openSession();
//        CustomerMapper customerMapper = sqlSession.getMapper(CustomerMapper.class);
        int result = customerMapper.updateByPrimaryKey(c);
        // 不要忘记写
//        sqlSession.commit();
        return result==1;
    }


}
